GdkColor black = {0, 0, 0, 0};
GdkRectangle r;
GdkOverlapType overlap;
-
+
gdk_drawable_get_size (priv->clip_mask, &w, &h);
r.x = 0;
/* Its quite common to expose areas that are completely in or outside
* the region, so we try to avoid allocating bitmaps that are just fully
* set or completely unset.
- */
+ */
overlap = gdk_region_rect_in (region, &r);
if (overlap == GDK_OVERLAP_RECTANGLE_PART)
{
}
else if (overlap == GDK_OVERLAP_RECTANGLE_OUT)
{
+ /* No intersection, set empty clip region */
GdkRegion *empty = gdk_region_new ();
+ gdk_region_destroy (region);
priv->old_clip_mask = g_object_ref (priv->clip_mask);
+ priv->clip_region = empty;
_gdk_windowing_gc_set_clip_region (gc, empty, FALSE);
- gdk_region_destroy (empty);
+ }
+ else
+ {
+ /* Completely inside region, don't set unnecessary clip */
+ gdk_region_destroy (region);
+ return;
}
}
else
priv->clip_region = region;
if (priv->old_clip_region)
gdk_region_intersect (region, priv->old_clip_region);
-
+
_gdk_windowing_gc_set_clip_region (gc, priv->clip_region, FALSE);
}
gdk_gc_set_clip_mask (gc, priv->old_clip_mask);
g_object_unref (priv->old_clip_mask);
priv->old_clip_mask = NULL;
+
+ if (priv->clip_region)
+ {
+ g_object_unref (priv->clip_region);
+ priv->clip_region = NULL;
+ }
}
else
{